package com.sakerk.generador.definition;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

public class GeneradorUtil {
	
	public void generarQuery(QueryGenerador query){
		this.generarJavaClassAndInterface(query);
	}
	
	public void generarJavaClassAndInterface(QueryGenerador query){
		String classQuery = "package "+query.getPackageDto()+"; \n\n";
			   classQuery += "public class "+query.getNombreQuery()+" { \n\n";
			   classQuery += this.generarAtributos(query.getParametros(), Constantes.OUT);
			   classQuery += "\n";
			   classQuery += this.generarGetterAndSetter(query.getParametros(), Constantes.OUT);
			   classQuery += "\n";
			   classQuery += "} \n";
			   
		String classCriteria = "package "+query.getPackageDto()+"; \n\n";
			   classCriteria += "import "+Constantes.IMPORT_DEFAULT+".utiles.Criteria; \n";
			   classCriteria += "public class "+query.getNombreQuery()+"Criteria extends Criteria { \n\n";
			   classCriteria += this.generarAtributos(query.getParametros(), Constantes.INPUT);
			   classCriteria += "\n";
			   classCriteria += this.generarGetterAndSetter(query.getParametros(), Constantes.INPUT);
			   classCriteria += "\n";
			   classCriteria += "} \n";

			   
			   
/*

	public ConsultaValidacionRegistroEmpresa consultaValidacionRegistroEmpresa(String _registroMTC,
																			   String _nomUsuario, 
																			   String _nombreRazonSocial,
																			   String _numeroRuc,
																			   String _correoElec)
	{																	  
		ConsultaValidacionRegistroEmpresaCriteria criteria = new ConsultaValidacionRegistroEmpresaCriteria();
		criteria.set_registroMTC(_registroMTC);
		criteria.set_nomUsuario(_nomUsuario);
		criteria.set_nombreRazonSocial(_nombreRazonSocial);
		criteria.set_numeroRuc(_numeroRuc);
		criteria.set_correoElec(_correoElec);
		List<ConsultaValidacionRegistroEmpresa> list = 
		(ArrayList<ConsultaValidacionRegistroEmpresa>) this.selectByCriteria("ConsultaValidacionRegistroEmpresa", criteria);
		if(!list.isEmpty()){
			return list.get(0);
		}
		return null;
	}

 */
			   

		 String classInterface = "package "+query.getPackageDao()+"; \n\n";
				classInterface += "import java.util.List; \n";
				classInterface += "import "+query.getPackageDto()+"."+query.getNombreQuery()+"; \n";
				classInterface += "import "+query.getPackageDto()+"."+query.getNombreQuery()+"Criteria; \n\n";
				classInterface += "public interface "+query.getNombreQuery()+"Mapper { \n";
				classInterface += "   List<"+query.getNombreQuery()+"> "+this.getNombreMetodoLower(query.getNombreQuery())+"("+query.getNombreQuery()+"Criteria criteria); \n";
				classInterface += "} \n";
				
				classInterface += "/* \n\n";
				classInterface += "public "+query.getNombreQuery()+" "+this.getNombreMetodoLower(query.getNombreQuery())+"("+this.generarParametros(query.getParametros())+") \n";
				classInterface += "{ \n";
				classInterface += query.getNombreQuery()+"Criteria criteria = new "+query.getNombreQuery()+"Criteria(); \n";
				classInterface += this.generarSetterParametros(query.getParametros())+" \n";
				classInterface += "List<"+query.getNombreQuery()+"> list = \n";
				classInterface += "(ArrayList<"+query.getNombreQuery()+">) this.selectByCriteria(\""+query.getNombreQuery()+"\", criteria); \n";
				classInterface += "if(!list.isEmpty()){ \n";
				classInterface += "return list.get(0); \n";
				classInterface += "} \n";
				classInterface += "return null; \n";
				classInterface += "} \n\n";
				
				classInterface += "public List<"+query.getNombreQuery()+"> "+this.getNombreMetodoLower(query.getNombreQuery())+"("+this.generarParametros(query.getParametros())+") \n";
				classInterface += "{ \n";
				classInterface += query.getNombreQuery()+"Criteria criteria = new "+query.getNombreQuery()+"Criteria(); \n";
				classInterface += this.generarSetterParametros(query.getParametros())+" \n";
				classInterface += "List<"+query.getNombreQuery()+"> list = \n";
				classInterface += "(ArrayList<"+query.getNombreQuery()+">) this.selectByCriteria(\""+query.getNombreQuery()+"\", criteria); \n";
				classInterface += "return list; \n";
				classInterface += "} \n";
				classInterface += "\n\n";
				classInterface += "<mapper resource=\""+Constantes.RUTA_DEFAULT+"/datos/mapper/"+query.getNombreQuery()+"Mapper.xml\"/> \n\n";
				
				classInterface += "*/ \n";
				
				
				 
			String mapperXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
			mapperXml += "<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" > \n";
			mapperXml += "<mapper namespace=\""+query.getPackageDao()+"."+query.getNombreQuery()+"Mapper\"> \n\n";
			mapperXml += "<select id=\""+this.getNombreMetodoLower(query.getNombreQuery())+"\" resultType=\""+query.getPackageDto()+"."+query.getNombreQuery()+"\" parameterType=\""+query.getPackageDto()+"."+query.getNombreQuery()+"Criteria\"> \n";
			mapperXml += "Ingresa aqui tu consulta!! \n";
			mapperXml += "</select> \n";
			mapperXml += "</mapper> \n";
			
			
					 
				 
		String rutaDao = query.getRutaSalidaJava()+"/"+query.getPackageDao().replace(".", "/")+"/"+query.getNombreQuery()+"Mapper.java";
		String rutaDto = query.getRutaSalidaJava()+"/"+query.getPackageDto().replace(".", "/")+"/"+query.getNombreQuery()+".java";
		String rutaDtoCriteria = query.getRutaSalidaJava()+"/"+query.getPackageDto().replace(".", "/")+"/"+query.getNombreQuery()+"Criteria.java";
		String rutaMapper = query.getRutaSalidaResources()+"/"+query.getPackageMapper().replace(".", "/")+"/"+query.getNombreQuery()+"Mapper.xml";
			   
			   System.out.println(classQuery);
			   System.out.println(classCriteria);
			   System.out.println(classInterface);
			   System.out.println(mapperXml);
			   
			   System.out.println(rutaDao);
			   System.out.println(rutaDto);
			   System.out.println(rutaDtoCriteria);
			   System.out.println(rutaMapper);
			   
			   this.crearArchivo(rutaDto, classQuery);
			   this.crearArchivo(rutaDao, classInterface);
			   this.crearArchivo(rutaDtoCriteria, classCriteria);
			   this.crearArchivo(rutaMapper, mapperXml);
			   
	}
	
	public String generarAtributos(List<ParametrosGenerador> params, String tipoIO){
		
		String atributos = "";
		
		for(ParametrosGenerador param : params){
			if(param.getTipoEntradaSalida().equals(tipoIO)){
				atributos += "private "+param.getTipoDato()+" "+param.getNombreParametro()+"; \n";
			}
		}
		
		return atributos;
	}
	

	public String generarGetterAndSetter(List<ParametrosGenerador> params, String tipoIO){

		String gettSetter = "";
		for(ParametrosGenerador param : params){
			if(param.getTipoEntradaSalida().equals(tipoIO)){
				gettSetter += "public "+param.getTipoDato()+" get"+this.getNombreMetodo(param.getNombreParametro())+"() { \n";
				gettSetter += "  return "+param.getNombreParametro()+"; \n";
				gettSetter += "} \n";
				
				gettSetter += "public void set"+this.getNombreMetodo(param.getNombreParametro())+"("+param.getTipoDato()+" "+param.getNombreParametro()+") { \n";
				gettSetter += "  this."+param.getNombreParametro()+" = "+param.getNombreParametro()+"; \n";
				gettSetter += "} \n";
				
			}
		}
		
		return gettSetter;
	}
	
	public String getNombreMetodo(String nombreMetodo){
		return nombreMetodo.substring(0, 1).toUpperCase() + nombreMetodo.substring(1, nombreMetodo.length());
	}
	public String getNombreMetodoLower(String nombreMetodo){
		return nombreMetodo.substring(0, 1).toLowerCase() + nombreMetodo.substring(1, nombreMetodo.length());
	}
	
	public void crearArchivo(String nombre, String contenido) {
        try {
        	
            String fileName = nombre;
            FileWriter fw;
            
            fw = new FileWriter(fileName);

            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(contenido);
            bw.close();
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
	
	public String generarParametros(List<ParametrosGenerador> params){
		
		String atributos = "";
		
		for(int i=0;i<params.size();i++){
			if(params.get(i).getTipoEntradaSalida().equals(Constantes.INPUT)){
					atributos += ", "+params.get(i).getTipoDato()+" "+params.get(i).getNombreParametro()+"";
					
			}
		}
		atributos = atributos.replaceFirst(",", "");
		atributos = atributos.replaceFirst(" ", "");
		return atributos;
	}
	//criteria.set_registroMTC(_registroMTC);
	public String generarSetterParametros(List<ParametrosGenerador> params){
		
		String atributos = "";
		
		for(int i=0;i<params.size();i++){
			if(params.get(i).getTipoEntradaSalida().equals(Constantes.INPUT)){
				atributos += "criteria.set"+this.getNombreMetodo(params.get(i).getNombreParametro())+"("+params.get(i).getNombreParametro()+"); \n";
			}
		}

		return atributos;
	}	
}
